package com.itheima.d1_stream;

import java.util.*;
import java.util.stream.Collectors;

//目标：掌握Stream流终结方法（收集操作）的使用
public class Demo5 {
    public static void main(String[] args) {
        List<Student> stus = new ArrayList<>();
        Student s1 = new Student("蜘蛛精", 26, 172.5);
        Student s2 = new Student("蜘蛛精", 26, 172.8);
        Student s3 = new Student("紫霞", 23, 167.6);
        Student s4 = new Student("白晶晶", 25, 169.0);
        Student s5 = new Student("牛魔王", 35, 183.3);
        Student s6 = new Student("牛夫人", 34, 168.5);
        Collections.addAll(stus, s1, s2, s3, s4, s5, s6);


        //需求1：请找出身高超过170的学生对象，并放到一个List集合中返回
        //1.1 获取流，并筛选出数据
        List<Student> list = stus.stream()
                .filter(student -> student.getHeight() > 170)
                //1.2 将流中数据收集到List集合中返回，使用Stream接口的collect方法，需要传入Collector收集器对象
                .collect(
                        //1.3 Collector收集器对象，建议使用Collectors工具来获取
                        Collectors.toList()
                );
        System.out.println(list);
        System.out.println("----------------------");

        //需求2：请找出身高超过170的学生对象，并放到一个Set集合中返回
        //2.1 获取流，并筛选出数据
        Set<Student> set = stus.stream().filter(student -> student.getHeight() > 170)
                //2.2 收集数据到Set集合，调用collect方法，传入收集Set集合的Collector收集器对象
                .collect(Collectors.toSet());
        System.out.println(set);
        System.out.println("----------------------");

        //需求3：请找出身高超过170的学生对象，并把学生对象的名字（键）和身高（值），存入到一个Map集合返回
        //3.1 获取流，并筛选
        Map<String, Double> map = stus.stream().filter(student -> student.getHeight() > 170)
                //3.2 把流中的学生对象，提取键和值，收集到Map集合。使用：collect收集方法，传入收集器
                //.collect(Collectors.toMap(Student::getName, Student::getHeight));
                //3.3 当收集的key有重复时，要从两个value中挑选一个，如果用toMap两个参数的方法代码会报错！得用3个参数的方法
                .collect(Collectors.toMap(Student::getName, Student::getHeight, (one, two) -> two));
        System.out.println(map);

    }
}
